package cn.dai.test.da.queue;

import org.junit.Test;

/**
 * @author ArkD42
 * @file Jdbc01
 * @create 2020 - 06 - 07 - 16:06
 */


// 数组模拟队列，但是只能使用一次
public class ArrayQueueDemo {

    private int maxSize;    //最大长度
    private int front;      //队列头位置
    private int rear;       //队列尾位置
    private int[] array;    //模拟队列

    // 初始化要求必须声明最大长度
    public ArrayQueueDemo(int maxSize) {
        this.maxSize = maxSize;

        // 注入最大长度完成初始化
        array = new int[this.maxSize];

        // 指向队列的头部，是队列头的前一个位置
        front = -1;

        // 指向队列的尾，队列的最后一个数据
        rear = -1;
    }

    // 判断队列是否为满？
    public boolean isFull(){
        // 如果rear等于队列的长度-1 即全部装满了
        return rear == (maxSize - 1);
    }

    // 判断队列是否为空？
    public boolean isEmpty(){
        return front == rear;
    }

    // 添加数据
    public void addQueue(int element){

        // 判断队列是否为满
        if (isFull()) {
            System.out.println("队列已满！！！");
            return;
        }
        // 叫尾标把，尾标先增值，然后插入队列元素
        rear ++;
        array[rear] = element;
        // 也可以这样写： array[++ rear] = element;
    }

    // 取出数据，头标前移
    public int getElement(){

        if (isEmpty()){
            // System.out.println("队列为空！！！");
            // return -1;
            throw new RuntimeException("队列为空！！！");
        }

        front ++;
        return array[front];
        // return array[++ front];
    }

    // 展示队列
    public void showSequence(){

        if (isEmpty()) {
            System.out.println("队列为空！！！");
            return;
        }

        for (int i = 0; i < array.length; i++) {
            System.out.printf("array[ %d ] = %d \n", i, array[i]);
        }
    }

    // 得到头元素
    public int showHead(){
        if (isEmpty()) throw new RuntimeException("队列为空！！！");
        return array[front + 1];
    }

}
